/*
 * UBLOX_neo6.h
 *
 *  Created on: Jan 12, 2014
 *      Author: bohni
 */

#ifndef UBLOX_NEO6_H_
#define UBLOX_NEO6_H_

#include "UART.h"


////////////////////////////////////////////////////////////////////////
// UBX PROTOCOLL

// | SYNC_CHAR_1 | SYNC_CHAR_2 | MESSAGE_CLASS | MESSAGE_ID |
//			LENGTH_a | LENGTH_b | Message .... Message | CHECK_A | CHECK_B|


// start sequence
#define SYNC_CHAR_1			0xb5
#define SYNC_CHAR_2			0x62


// Message Class

#define NAV					0x01
#define RXM					0x02
#define INF					0x04
#define ACK					0x05
#define CFG					0x06
#define MON					0x0A
#define AID					0x0B
#define TIM					0x0D

// Message ID

// NAV:
#define NAV_POSECEF			0x01	// Position Solution in ECEF
#define NAV_POSECEF_L		20		// length in bytes
#define NAV_POSLLH			0x02  	// Geodetic Position Solution
#define NAV_POSLLH_L		28		// length in bytes

// CHECKSUM
// buffer[N]: | MESSAGE_CLASS | MESSAGE_ID | LENGTH_a | LENGTH_b | Message .... Message |

//	CK_A = 0, CK_B = 0
//	For(I=0;I<N;I++)
//	{
//		CK_A = CK_A + Buffer[I]
//		CK_B = CK_B + CK_A
//	}


////////////////////////////////////////////////////////////
// Variables

extern uint8_t checksum_error;
extern struct gps_position position;

struct gps_position {	// Values as provided by NAV_POSLLH

					// value
	uint32_t iTOW; 	// ms	: GPS Millisecond Time of Week
	int32_t lon;	// deg	: Longitude
	int32_t lat;	// deg	: Latitude
	int32_t height;	// mm	: Height above Ellipsoid
	int32_t hMSL;	// mm	: Height above mean sea level
	uint8_t hAcc;	// mm	: Horizontal Accuracy Estimate
	uint8_t vAcc;	// mm	: Vertical Accuracy Estimate

};

///////////////////////////////////////////////////////////
// Functions


void neo6_init();

void neo6_get_position();

void compute_checksum();


////////////////////////////////////////////////////////////

#endif /* UBLOX_NEO6_H_ */
